home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / python2.6 / threading.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-11-11  |  28KB  |  936 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. """Thread module emulating a subset of Java's threading model."""
  5. import sys as _sys
  6.  
  7. try:
  8.     import thread
  9. except ImportError:
  10.     del _sys.modules[__name__]
  11.     raise 
  12.  
  13. import warnings
  14. from functools import wraps
  15. from time import time as _time, sleep as _sleep
  16. from traceback import format_exc as _format_exc
  17. from collections import deque
  18. __all__ = [
  19.     'activeCount',
  20.     'active_count',
  21.     'Condition',
  22.     'currentThread',
  23.     'current_thread',
  24.     'enumerate',
  25.     'Event',
  26.     'Lock',
  27.     'RLock',
  28.     'Semaphore',
  29.     'BoundedSemaphore',
  30.     'Thread',
  31.     'Timer',
  32.     'setprofile',
  33.     'settrace',
  34.     'local',
  35.     'stack_size']
  36. _start_new_thread = thread.start_new_thread
  37. _allocate_lock = thread.allocate_lock
  38. _get_ident = thread.get_ident
  39. ThreadError = thread.error
  40. del thread
  41. warnings.filterwarnings('ignore', category = DeprecationWarning, module = 'threading', message = 'sys.exc_clear')
  42. _VERBOSE = False
  43.  
  44. class _Verbose(object):
  45.     
  46.     def __init__(self, verbose = None):
  47.         if verbose is None:
  48.             verbose = _VERBOSE
  49.         
  50.         self._Verbose__verbose = verbose
  51.  
  52.     
  53.     def _note(self, format, *args):
  54.         if self._Verbose__verbose:
  55.             format = format % args
  56.             format = '%s: %s\n' % (current_thread().name, format)
  57.             _sys.stderr.write(format)
  58.         
  59.  
  60.  
  61. _profile_hook = None
  62. _trace_hook = None
  63.  
  64. def setprofile(func):
  65.     global _profile_hook
  66.     _profile_hook = func
  67.  
  68.  
  69. def settrace(func):
  70.     global _trace_hook
  71.     _trace_hook = func
  72.  
  73. Lock = _allocate_lock
  74.  
  75. def RLock(*args, **kwargs):
  76.     return _RLock(*args, **kwargs)
  77.  
  78.  
  79. class _RLock(_Verbose):
  80.     
  81.     def __init__(self, verbose = None):
  82.         _Verbose.__init__(self, verbose)
  83.         self._RLock__block = _allocate_lock()
  84.         self._RLock__owner = None
  85.         self._RLock__count = 0
  86.  
  87.     
  88.     def __repr__(self):
  89.         owner = self._RLock__owner
  90.         if owner:
  91.             pass
  92.         return '<%s(%s, %d)>' % (self.__class__.__name__, owner.name, self._RLock__count)
  93.  
  94.     
  95.     def acquire(self, blocking = 1):
  96.         me = current_thread()
  97.         if self._RLock__owner is me:
  98.             self._RLock__count = self._RLock__count + 1
  99.             self._note('%s.acquire(%s): recursive success', self, blocking)
  100.             return 1
  101.         rc = self._RLock__block.acquire(blocking)
  102.         if rc:
  103.             self._RLock__owner = me
  104.             self._RLock__count = 1
  105.             self._note('%s.acquire(%s): initial success', self, blocking)
  106.         else:
  107.             self._note('%s.acquire(%s): failure', self, blocking)
  108.         return rc
  109.  
  110.     __enter__ = acquire
  111.     
  112.     def release(self):
  113.         if self._RLock__owner is not current_thread():
  114.             raise RuntimeError('cannot release un-aquired lock')
  115.         self._RLock__owner is not current_thread()
  116.         self._RLock__count = count = self._RLock__count - 1
  117.         if not count:
  118.             self._RLock__owner = None
  119.             self._RLock__block.release()
  120.             self._note('%s.release(): final release', self)
  121.         else:
  122.             self._note('%s.release(): non-final release', self)
  123.  
  124.     
  125.     def __exit__(self, t, v, tb):
  126.         self.release()
  127.  
  128.     
  129.     def _acquire_restore(self, count_owner):
  130.         (count, owner) = count_owner
  131.         self._RLock__block.acquire()
  132.         self._RLock__count = count
  133.         self._RLock__owner = owner
  134.         self._note('%s._acquire_restore()', self)
  135.  
  136.     
  137.     def _release_save(self):
  138.         self._note('%s._release_save()', self)
  139.         count = self._RLock__count
  140.         self._RLock__count = 0
  141.         owner = self._RLock__owner
  142.         self._RLock__owner = None
  143.         self._RLock__block.release()
  144.         return (count, owner)
  145.  
  146.     
  147.     def _is_owned(self):
  148.         return self._RLock__owner is current_thread()
  149.  
  150.  
  151.  
  152. def Condition(*args, **kwargs):
  153.     return _Condition(*args, **kwargs)
  154.  
  155.  
  156. class _Condition(_Verbose):
  157.     
  158.     def __init__(self, lock = None, verbose = None):
  159.         _Verbose.__init__(self, verbose)
  160.         if lock is None:
  161.             lock = RLock()
  162.         
  163.         self._Condition__lock = lock
  164.         self.acquire = lock.acquire
  165.         self.release = lock.release
  166.         
  167.         try:
  168.             self._release_save = lock._release_save
  169.         except AttributeError:
  170.             pass
  171.  
  172.         
  173.         try:
  174.             self._acquire_restore = lock._acquire_restore
  175.         except AttributeError:
  176.             pass
  177.  
  178.         
  179.         try:
  180.             self._is_owned = lock._is_owned
  181.         except AttributeError:
  182.             pass
  183.  
  184.         self._Condition__waiters = []
  185.  
  186.     
  187.     def __enter__(self):
  188.         return self._Condition__lock.__enter__()
  189.  
  190.     
  191.     def __exit__(self, *args):
  192.         return self._Condition__lock.__exit__(*args)
  193.  
  194.     
  195.     def __repr__(self):
  196.         return '<Condition(%s, %d)>' % (self._Condition__lock, len(self._Condition__waiters))
  197.  
  198.     
  199.     def _release_save(self):
  200.         self._Condition__lock.release()
  201.  
  202.     
  203.     def _acquire_restore(self, x):
  204.         self._Condition__lock.acquire()
  205.  
  206.     
  207.     def _is_owned(self):
  208.         if self._Condition__lock.acquire(0):
  209.             self._Condition__lock.release()
  210.             return False
  211.         return True
  212.  
  213.     
  214.     def wait(self, timeout = None):
  215.         if not self._is_owned():
  216.             raise RuntimeError('cannot wait on un-aquired lock')
  217.         self._is_owned()
  218.         waiter = _allocate_lock()
  219.         waiter.acquire()
  220.         self._Condition__waiters.append(waiter)
  221.         saved_state = self._release_save()
  222.         
  223.         try:
  224.             if timeout is None:
  225.                 waiter.acquire()
  226.                 self._note('%s.wait(): got it', self)
  227.             else:
  228.                 endtime = _time() + timeout
  229.                 delay = 0.0005
  230.                 while True:
  231.                     gotit = waiter.acquire(0)
  232.                     if gotit:
  233.                         break
  234.                     
  235.                     remaining = endtime - _time()
  236.                     if remaining <= 0:
  237.                         break
  238.                     
  239.                     delay = min(delay * 2, remaining, 0.05)
  240.                     _sleep(delay)
  241.                 if not gotit:
  242.                     self._note('%s.wait(%s): timed out', self, timeout)
  243.                     
  244.                     try:
  245.                         self._Condition__waiters.remove(waiter)
  246.                     except ValueError:
  247.                         pass
  248.                     except:
  249.                         None<EXCEPTION MATCH>ValueError
  250.                     
  251.  
  252.                 None<EXCEPTION MATCH>ValueError
  253.                 self._note('%s.wait(%s): got it', self, timeout)
  254.         finally:
  255.             self._acquire_restore(saved_state)
  256.  
  257.  
  258.     
  259.     def notify(self, n = 1):
  260.         if not self._is_owned():
  261.             raise RuntimeError('cannot notify on un-aquired lock')
  262.         self._is_owned()
  263.         _Condition__waiters = self._Condition__waiters
  264.         waiters = _Condition__waiters[:n]
  265.         waiters(self._note, '%s.notify(): notifying %d waiter%s', self, n if not waiters else '')
  266.         for waiter in waiters:
  267.             waiter.release()
  268.             
  269.             try:
  270.                 _Condition__waiters.remove(waiter)
  271.             continue
  272.             except ValueError:
  273.                 continue
  274.             
  275.  
  276.         
  277.  
  278.     
  279.     def notifyAll(self):
  280.         self.notify(len(self._Condition__waiters))
  281.  
  282.     notify_all = notifyAll
  283.  
  284.  
  285. def Semaphore(*args, **kwargs):
  286.     return _Semaphore(*args, **kwargs)
  287.  
  288.  
  289. class _Semaphore(_Verbose):
  290.     
  291.     def __init__(self, value = 1, verbose = None):
  292.         if value < 0:
  293.             raise ValueError('semaphore initial value must be >= 0')
  294.         value < 0
  295.         _Verbose.__init__(self, verbose)
  296.         self._Semaphore__cond = Condition(Lock())
  297.         self._Semaphore__value = value
  298.  
  299.     
  300.     def acquire(self, blocking = 1):
  301.         rc = False
  302.         self._Semaphore__cond.acquire()
  303.         while self._Semaphore__value == 0:
  304.             if not blocking:
  305.                 break
  306.             
  307.             self._note('%s.acquire(%s): blocked waiting, value=%s', self, blocking, self._Semaphore__value)
  308.             self._Semaphore__cond.wait()
  309.         self._Semaphore__value = self._Semaphore__value - 1
  310.         self._note('%s.acquire: success, value=%s', self, self._Semaphore__value)
  311.         rc = True
  312.         self._Semaphore__cond.release()
  313.         return rc
  314.  
  315.     __enter__ = acquire
  316.     
  317.     def release(self):
  318.         self._Semaphore__cond.acquire()
  319.         self._Semaphore__value = self._Semaphore__value + 1
  320.         self._note('%s.release: success, value=%s', self, self._Semaphore__value)
  321.         self._Semaphore__cond.notify()
  322.         self._Semaphore__cond.release()
  323.  
  324.     
  325.     def __exit__(self, t, v, tb):
  326.         self.release()
  327.  
  328.  
  329.  
  330. def BoundedSemaphore(*args, **kwargs):
  331.     return _BoundedSemaphore(*args, **kwargs)
  332.  
  333.  
  334. class _BoundedSemaphore(_Semaphore):
  335.     '''Semaphore that checks that # releases is <= # acquires'''
  336.     
  337.     def __init__(self, value = 1, verbose = None):
  338.         _Semaphore.__init__(self, value, verbose)
  339.         self._initial_value = value
  340.  
  341.     
  342.     def release(self):
  343.         if self._Semaphore__value >= self._initial_value:
  344.             raise ValueError, 'Semaphore released too many times'
  345.         self._Semaphore__value >= self._initial_value
  346.         return _Semaphore.release(self)
  347.  
  348.  
  349.  
  350. def Event(*args, **kwargs):
  351.     return _Event(*args, **kwargs)
  352.  
  353.  
  354. class _Event(_Verbose):
  355.     
  356.     def __init__(self, verbose = None):
  357.         _Verbose.__init__(self, verbose)
  358.         self._Event__cond = Condition(Lock())
  359.         self._Event__flag = False
  360.  
  361.     
  362.     def isSet(self):
  363.         return self._Event__flag
  364.  
  365.     is_set = isSet
  366.     
  367.     def set(self):
  368.         self._Event__cond.acquire()
  369.         
  370.         try:
  371.             self._Event__flag = True
  372.             self._Event__cond.notify_all()
  373.         finally:
  374.             self._Event__cond.release()
  375.  
  376.  
  377.     
  378.     def clear(self):
  379.         self._Event__cond.acquire()
  380.         
  381.         try:
  382.             self._Event__flag = False
  383.         finally:
  384.             self._Event__cond.release()
  385.  
  386.  
  387.     
  388.     def wait(self, timeout = None):
  389.         self._Event__cond.acquire()
  390.         
  391.         try:
  392.             if not self._Event__flag:
  393.                 self._Event__cond.wait(timeout)
  394.         finally:
  395.             self._Event__cond.release()
  396.  
  397.  
  398.  
  399. _counter = 0
  400.  
  401. def _newname(template = 'Thread-%d'):
  402.     global _counter
  403.     _counter = _counter + 1
  404.     return template % _counter
  405.  
  406. _active_limbo_lock = _allocate_lock()
  407. _active = { }
  408. _limbo = { }
  409.  
  410. class Thread(_Verbose):
  411.     __initialized = False
  412.     __exc_info = _sys.exc_info
  413.     __exc_clear = _sys.exc_clear
  414.     
  415.     def __init__(self, group = None, target = None, name = None, args = (), kwargs = None, verbose = None):
  416.         if not group is None:
  417.             raise AssertionError, 'group argument must be None for now'
  418.         _Verbose.__init__(self, verbose)
  419.         if kwargs is None:
  420.             kwargs = { }
  421.         
  422.         self._Thread__target = target
  423.         if not name:
  424.             pass
  425.         self._Thread__name = str(_newname())
  426.         self._Thread__args = args
  427.         self._Thread__kwargs = kwargs
  428.         self._Thread__daemonic = self._set_daemon()
  429.         self._Thread__ident = None
  430.         self._Thread__started = Event()
  431.         self._Thread__stopped = False
  432.         self._Thread__block = Condition(Lock())
  433.         self._Thread__initialized = True
  434.         self._Thread__stderr = _sys.stderr
  435.  
  436.     
  437.     def _set_daemon(self):
  438.         return current_thread().daemon
  439.  
  440.     
  441.     def __repr__(self):
  442.         if not self._Thread__initialized:
  443.             raise AssertionError, 'Thread.__init__() was not called'
  444.         status = 'initial'
  445.         if self._Thread__started.is_set():
  446.             status = 'started'
  447.         
  448.         if self._Thread__stopped:
  449.             status = 'stopped'
  450.         
  451.         if self._Thread__daemonic:
  452.             status += ' daemon'
  453.         
  454.         if self._Thread__ident is not None:
  455.             status += ' %s' % self._Thread__ident
  456.         
  457.         return '<%s(%s, %s)>' % (self.__class__.__name__, self._Thread__name, status)
  458.  
  459.     
  460.     def start(self):
  461.         if not self._Thread__initialized:
  462.             raise RuntimeError('thread.__init__() not called')
  463.         self._Thread__initialized
  464.         if self._Thread__started.is_set():
  465.             raise RuntimeError('thread already started')
  466.         self._Thread__started.is_set()
  467.         self._note('%s.start(): starting thread', self)
  468.         _active_limbo_lock.acquire()
  469.         _limbo[self] = self
  470.         _active_limbo_lock.release()
  471.         _start_new_thread(self._Thread__bootstrap, ())
  472.         self._Thread__started.wait()
  473.  
  474.     
  475.     def run(self):
  476.         
  477.         try:
  478.             if self._Thread__target:
  479.                 self._Thread__target(*self._Thread__args, **self._Thread__kwargs)
  480.         finally:
  481.             del self._Thread__target
  482.             del self._Thread__args
  483.             del self._Thread__kwargs
  484.  
  485.  
  486.     
  487.     def __bootstrap(self):
  488.         
  489.         try:
  490.             self._Thread__bootstrap_inner()
  491.         except:
  492.             if self._Thread__daemonic and _sys is None:
  493.                 return None
  494.             raise 
  495.  
  496.  
  497.     
  498.     def _set_ident(self):
  499.         self._Thread__ident = _get_ident()
  500.  
  501.     
  502.     def __bootstrap_inner(self):
  503.         
  504.         try:
  505.             self._set_ident()
  506.             self._Thread__started.set()
  507.             _active_limbo_lock.acquire()
  508.             _active[self._Thread__ident] = self
  509.             del _limbo[self]
  510.             _active_limbo_lock.release()
  511.             self._note('%s.__bootstrap(): thread started', self)
  512.             if _trace_hook:
  513.                 self._note('%s.__bootstrap(): registering trace hook', self)
  514.                 _sys.settrace(_trace_hook)
  515.             
  516.             if _profile_hook:
  517.                 self._note('%s.__bootstrap(): registering profile hook', self)
  518.                 _sys.setprofile(_profile_hook)
  519.             
  520.             
  521.             try:
  522.                 self.run()
  523.             except SystemExit:
  524.                 self._note('%s.__bootstrap(): raised SystemExit', self)
  525.             except:
  526.                 self._note('%s.__bootstrap(): unhandled exception', self)
  527.                 if _sys:
  528.                     _sys.stderr.write('Exception in thread %s:\n%s\n' % (self.name, _format_exc()))
  529.                 else:
  530.                     (exc_type, exc_value, exc_tb) = self._Thread__exc_info()
  531.                     
  532.                     try:
  533.                         print >>self._Thread__stderr, 'Exception in thread ' + self.name + ' (most likely raised during interpreter shutdown):'
  534.                         print >>self._Thread__stderr, 'Traceback (most recent call last):'
  535.                         while exc_tb:
  536.                             print >>self._Thread__stderr, '  File "%s", line %s, in %s' % (exc_tb.tb_frame.f_code.co_filename, exc_tb.tb_lineno, exc_tb.tb_frame.f_code.co_name)
  537.                             exc_tb = exc_tb.tb_next
  538.                         print >>self._Thread__stderr, '%s: %s' % (exc_type, exc_value)
  539.                     finally:
  540.                         del exc_type
  541.                         del exc_value
  542.                         del exc_tb
  543.  
  544.             else:
  545.                 self._note('%s.__bootstrap(): normal return', self)
  546.             finally:
  547.                 self._Thread__exc_clear()
  548.  
  549.         finally:
  550.             _active_limbo_lock.__enter__()
  551.             
  552.             try:
  553.                 self._Thread__stop()
  554.                 
  555.                 try:
  556.                     del _active[_get_ident()]
  557.                 except:
  558.                     _active_limbo_lock.__exit__
  559.                     _active_limbo_lock
  560.  
  561.             finally:
  562.                 pass
  563.  
  564.  
  565.  
  566.     
  567.     def __stop(self):
  568.         self._Thread__block.acquire()
  569.         self._Thread__stopped = True
  570.         self._Thread__block.notify_all()
  571.         self._Thread__block.release()
  572.  
  573.     
  574.     def __delete(self):
  575.         '''Remove current thread from the dict of currently running threads.'''
  576.         
  577.         try:
  578.             _active_limbo_lock.__enter__()
  579.             
  580.             try:
  581.                 del _active[_get_ident()]
  582.             finally:
  583.                 pass
  584.  
  585.         except KeyError:
  586.             if 'dummy_threading' not in _sys.modules:
  587.                 raise 
  588.             'dummy_threading' not in _sys.modules
  589.  
  590.  
  591.     
  592.     def join(self, timeout = None):
  593.         if not self._Thread__initialized:
  594.             raise RuntimeError('Thread.__init__() not called')
  595.         self._Thread__initialized
  596.         if not self._Thread__started.is_set():
  597.             raise RuntimeError('cannot join thread before it is started')
  598.         self._Thread__started.is_set()
  599.         if self is current_thread():
  600.             raise RuntimeError('cannot join current thread')
  601.         self is current_thread()
  602.         if not self._Thread__stopped:
  603.             self._note('%s.join(): waiting until thread stops', self)
  604.         
  605.         self._Thread__block.acquire()
  606.         
  607.         try:
  608.             if timeout is None:
  609.                 while not self._Thread__stopped:
  610.                     self._Thread__block.wait()
  611.                 self._note('%s.join(): thread stopped', self)
  612.             else:
  613.                 deadline = _time() + timeout
  614.                 while not self._Thread__stopped:
  615.                     delay = deadline - _time()
  616.                     if delay <= 0:
  617.                         self._note('%s.join(): timed out', self)
  618.                         break
  619.                     
  620.                     self._Thread__block.wait(delay)
  621.                 self._note('%s.join(): thread stopped', self)
  622.         finally:
  623.             self._Thread__block.release()
  624.  
  625.  
  626.     
  627.     def name(self):
  628.         if not self._Thread__initialized:
  629.             raise AssertionError, 'Thread.__init__() not called'
  630.         return self._Thread__name
  631.  
  632.     name = property(name)
  633.     
  634.     def name(self, name):
  635.         if not self._Thread__initialized:
  636.             raise AssertionError, 'Thread.__init__() not called'
  637.         self._Thread__name = str(name)
  638.  
  639.     name = name.setter(name)
  640.     
  641.     def ident(self):
  642.         if not self._Thread__initialized:
  643.             raise AssertionError, 'Thread.__init__() not called'
  644.         return self._Thread__ident
  645.  
  646.     ident = property(ident)
  647.     
  648.     def isAlive(self):
  649.         return self._Thread__initialized if not self._Thread__initialized else not (self._Thread__stopped)
  650.  
  651.     is_alive = isAlive
  652.     
  653.     def daemon(self):
  654.         if not self._Thread__initialized:
  655.             raise AssertionError, 'Thread.__init__() not called'
  656.         return self._Thread__daemonic
  657.  
  658.     daemon = property(daemon)
  659.     
  660.     def daemon(self, daemonic):
  661.         if not self._Thread__initialized:
  662.             raise RuntimeError('Thread.__init__() not called')
  663.         self._Thread__initialized
  664.         if self._Thread__started.is_set():
  665.             raise RuntimeError('cannot set daemon status of active thread')
  666.         self._Thread__started.is_set()
  667.         self._Thread__daemonic = daemonic
  668.  
  669.     daemon = daemon.setter(daemon)
  670.     
  671.     def isDaemon(self):
  672.         return self.daemon
  673.  
  674.     
  675.     def setDaemon(self, daemonic):
  676.         self.daemon = daemonic
  677.  
  678.     
  679.     def getName(self):
  680.         return self.name
  681.  
  682.     
  683.     def setName(self, name):
  684.         self.name = name
  685.  
  686.  
  687.  
  688. def Timer(*args, **kwargs):
  689.     return _Timer(*args, **kwargs)
  690.  
  691.  
  692. class _Timer(Thread):
  693.     """Call a function after a specified number of seconds:
  694.  
  695.     t = Timer(30.0, f, args=[], kwargs={})
  696.     t.start()
  697.     t.cancel() # stop the timer's action if it's still waiting
  698.     """
  699.     
  700.     def __init__(self, interval, function, args = [], kwargs = { }):
  701.         Thread.__init__(self)
  702.         self.interval = interval
  703.         self.function = function
  704.         self.args = args
  705.         self.kwargs = kwargs
  706.         self.finished = Event()
  707.  
  708.     
  709.     def cancel(self):
  710.         """Stop the timer if it hasn't finished yet"""
  711.         self.finished.set()
  712.  
  713.     
  714.     def run(self):
  715.         self.finished.wait(self.interval)
  716.         if not self.finished.is_set():
  717.             self.function(*self.args, **self.kwargs)
  718.         
  719.         self.finished.set()
  720.  
  721.  
  722.  
  723. class _MainThread(Thread):
  724.     
  725.     def __init__(self):
  726.         Thread.__init__(self, name = 'MainThread')
  727.         self._Thread__started.set()
  728.         self._set_ident()
  729.         _active_limbo_lock.acquire()
  730.         _active[_get_ident()] = self
  731.         _active_limbo_lock.release()
  732.  
  733.     
  734.     def _set_daemon(self):
  735.         return False
  736.  
  737.     
  738.     def _exitfunc(self):
  739.         self._Thread__stop()
  740.         t = _pickSomeNonDaemonThread()
  741.         if t:
  742.             self._note('%s: waiting for other threads', self)
  743.         
  744.         while t:
  745.             t.join()
  746.             t = _pickSomeNonDaemonThread()
  747.         self._note('%s: exiting', self)
  748.         self._Thread__delete()
  749.  
  750.  
  751.  
  752. def _pickSomeNonDaemonThread():
  753.     for t in enumerate():
  754.         if not (t.daemon) and t.is_alive():
  755.             return t
  756.     
  757.  
  758.  
  759. class _DummyThread(Thread):
  760.     
  761.     def __init__(self):
  762.         Thread.__init__(self, name = _newname('Dummy-%d'))
  763.         del self._Thread__block
  764.         self._Thread__started.set()
  765.         self._set_ident()
  766.         _active_limbo_lock.acquire()
  767.         _active[_get_ident()] = self
  768.         _active_limbo_lock.release()
  769.  
  770.     
  771.     def _set_daemon(self):
  772.         return True
  773.  
  774.     
  775.     def join(self, timeout = None):
  776.         if not False:
  777.             raise AssertionError, 'cannot join a dummy thread'
  778.  
  779.  
  780.  
  781. def currentThread():
  782.     
  783.     try:
  784.         return _active[_get_ident()]
  785.     except KeyError:
  786.         return _DummyThread()
  787.  
  788.  
  789. current_thread = currentThread
  790.  
  791. def activeCount():
  792.     _active_limbo_lock.acquire()
  793.     count = len(_active) + len(_limbo)
  794.     _active_limbo_lock.release()
  795.     return count
  796.  
  797. active_count = activeCount
  798.  
  799. def enumerate():
  800.     _active_limbo_lock.acquire()
  801.     active = _active.values() + _limbo.values()
  802.     _active_limbo_lock.release()
  803.     return active
  804.  
  805. from thread import stack_size
  806. _shutdown = _MainThread()._exitfunc
  807.  
  808. try:
  809.     from thread import _local as local
  810. except ImportError:
  811.     from _threading_local import local
  812.  
  813.  
  814. def _after_fork():
  815.     global _active_limbo_lock
  816.     _active_limbo_lock = _allocate_lock()
  817.     new_active = { }
  818.     current = current_thread()
  819.     _active_limbo_lock.__enter__()
  820.     
  821.     try:
  822.         for thread in _active.itervalues():
  823.             if thread is current:
  824.                 ident = _get_ident()
  825.                 thread._Thread__ident = ident
  826.                 new_active[ident] = thread
  827.                 continue
  828.             _active_limbo_lock.__exit__
  829.             thread._Thread__stopped = True
  830.         
  831.         _limbo.clear()
  832.         _active.clear()
  833.         _active.update(new_active)
  834.         if not len(_active) == 1:
  835.             raise AssertionError
  836.     finally:
  837.         pass
  838.  
  839.  
  840.  
  841. def _test():
  842.     
  843.     class BoundedQueue(_Verbose):
  844.         
  845.         def __init__(self, limit):
  846.             _Verbose.__init__(self)
  847.             self.mon = RLock()
  848.             self.rc = Condition(self.mon)
  849.             self.wc = Condition(self.mon)
  850.             self.limit = limit
  851.             self.queue = deque()
  852.  
  853.         
  854.         def put(self, item):
  855.             self.mon.acquire()
  856.             while len(self.queue) >= self.limit:
  857.                 self._note('put(%s): queue full', item)
  858.                 self.wc.wait()
  859.             self.queue.append(item)
  860.             self._note('put(%s): appended, length now %d', item, len(self.queue))
  861.             self.rc.notify()
  862.             self.mon.release()
  863.  
  864.         
  865.         def get(self):
  866.             self.mon.acquire()
  867.             while not self.queue:
  868.                 self._note('get(): queue empty')
  869.                 self.rc.wait()
  870.             item = self.queue.popleft()
  871.             self._note('get(): got %s, %d left', item, len(self.queue))
  872.             self.wc.notify()
  873.             self.mon.release()
  874.             return item
  875.  
  876.  
  877.     
  878.     class ProducerThread(Thread):
  879.         
  880.         def __init__(self, queue, quota):
  881.             Thread.__init__(self, name = 'Producer')
  882.             self.queue = queue
  883.             self.quota = quota
  884.  
  885.         
  886.         def run(self):
  887.             random = random
  888.             import random
  889.             counter = 0
  890.             while counter < self.quota:
  891.                 counter = counter + 1
  892.                 self.queue.put('%s.%d' % (self.name, counter))
  893.                 _sleep(random() * 1e-05)
  894.  
  895.  
  896.     
  897.     class ConsumerThread(Thread):
  898.         
  899.         def __init__(self, queue, count):
  900.             Thread.__init__(self, name = 'Consumer')
  901.             self.queue = queue
  902.             self.count = count
  903.  
  904.         
  905.         def run(self):
  906.             while self.count > 0:
  907.                 item = self.queue.get()
  908.                 print item
  909.                 self.count = self.count - 1
  910.  
  911.  
  912.     NP = 3
  913.     QL = 4
  914.     NI = 5
  915.     Q = BoundedQueue(QL)
  916.     P = []
  917.     for i in range(NP):
  918.         t = ProducerThread(Q, NI)
  919.         t.name = 'Producer-%d' % (i + 1)
  920.         P.append(t)
  921.     
  922.     C = ConsumerThread(Q, NI * NP)
  923.     for t in P:
  924.         t.start()
  925.         _sleep(1e-06)
  926.     
  927.     C.start()
  928.     for t in P:
  929.         t.join()
  930.     
  931.     C.join()
  932.  
  933. if __name__ == '__main__':
  934.     _test()
  935.  
  936.